Software applications generally are operative to perform a predefined functionality in a predefined context. For example, a database application generally allows a user to construct a structured database that can be readily populated and searched.
Early software applications had severely limited flexibility as to functionality. Routines were coded to perform a specific function on a specific type of data. If different functionality was required, a new routine had to be written. Even minor modifications of the functionality or data generally required the services of a specialist to write lines of code to address the change.
A significant advance was provided by the philosophy of object-oriented programming. This often involves significant flexibility of the functionality within a specific processing context and an abstraction of the data of interest to a metadata model. Thus, items of data or functional components may be represented as “objects” that can assume different attributes for different processing functions. In this manner, flexible processing components may be established for performing a variety of data handling functions that are commonly required for a particular application. For example, a flexible processing engine may be developed to track inventory. This may involve monitoring additions to inventory and shipments from inventory to facilitate maintenance of a desired stock level. Because the processing engine is flexible, it can be readily configured to add products to be monitored, to revise a stock level or even, perhaps, to revise the specific functionality performed within an application context, e.g., to monitor on-line orders. Ideally, this does not require that new routines be written, it merely requires that the existing objects be associated with attributes that define the new data or functionality.
While such programming represents a significant advance, it is still generally necessary to independently obtain or develop applications for each desired application objective and to undertake substantial configuration for each application environment. Thus, a business may have one application for loading data into a database, one application for handling on-line ordering, one application for inventory management, etc. Each of these applications is generally independently developed and configured for a particular application environment, with little or no transference of time and knowledge investment between the applications. From the perspective of the business, this is problematic because of the expense and other resources required to implement, coordinate and update a large number of applications. From the perspective of developers, this is problematic due to the significant maintenance and servicing requirements. This results in the common phenomenon of software development companies gravitating towards software servicing as an increasing operational emphasis.